/*
 * Copyright 2010 Gal Dolber.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.jaspec;

import static junit.framework.Assert.*;

import java.util.StringTokenizer;

public class JaspecStringHave {

  private final JaspecString j;
  private final int i;
  private final Have shouldHave;

  public JaspecStringHave(JaspecString j, int i, Have shouldHave) {
    this.j = j;
    this.i = i;
    this.shouldHave = shouldHave;
  }

  /**
   * Check the number of words.
   */
  public void words() {
    int size = countWords(j.obj);
    check(size, "words");
  }

  /**
   * Check the number of letters.
   */
  public void letters() {
    check(j.obj.length(), "letters");
  }

  private void check(int size, String kind) {
    if (!j.not) {
      switch (shouldHave) {
        case EXACTLY:
          assertEquals("The string should have " + i + " " + kind, size, i);
          break;
        case AT_LEAST:
          assertTrue("The string should have at least " + i + " " + kind, size >= i);
          break;
        case AT_MOST:
          assertTrue("The string should have at most " + i + " " + kind, size <= i);
          break;
      }
    } else {
      switch (shouldHave) {
        case EXACTLY:
          assertNotSame("The string should not have " + i + " " + kind, size, i);
          break;
        case AT_LEAST:
          assertFalse("The string should not have at least " + i + " " + kind, size >= i);
          break;
        case AT_MOST:
          assertFalse("The string should not have at most " + i + " " + kind, size <= i);
          break;
      }
    }
  }

  private int countWords(String obj) {
    StringTokenizer t = new StringTokenizer(obj);
    int count;
    for (count = 0; t.hasMoreTokens(); count++, t.nextToken()) {
    }
    return count;
  }
}
